var express = require('express');
var app = express();
// 引入 mongoDB模块，获得它的客户端对象
var MongoClient = require('mongodb').MongoClient;
// mongoDB连接字符串
var DB_CONN_STR = 'mongodb://localhost:27017/';

// 解决跨域问题
app.all('*', function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Method", "*");
    res.header("Access-Control-Allow-Headers","Content-Type");
    res.header("Access-Control-Max-Age", "3600");
    next();
});

// 用来临时的存数据
var _xxObj = {
    arrs:[{
        id:'n1',
        name:'在售！',
        vals:'手机'
    },{
        id:'n2',
        name:'在售！',
        vals:'家电'
    },{
        id:'n3',
        name:'在售',
        vals:'汽车'
    },{
        id:'n3',
        name:'在售',
        vals:'女装'
    }]
}

// 保存过滤的结果，因为现在没有db
var _filterResult = null;

// 过滤方法
function filter( _val ){
	return _xxObj.arrs.filter( _g =>{
		return _g.vals === _val
	})
}

// 第一个nodeJs接口，接收
app.get('/node_a', function(req, res){
	console.log( req.query.v_data );

	let _result = filter( req.query.v_data );

	_filterResult = _result.length !== 0 ? _result : [{id:'xxx', name:'卖完啦！'}]

	res.end();
});

// 第二个接口，发送
app.get('/node_b', function(req, res){
	return res.send( _filterResult )
});

// 用户注册信息,并调用查询是否注册同名信息方法
app.post('/register_post', function(req, res){
	let _allData = '';

	req.on('data', function(_d){
		_allData+= _d;
	});

	req.on('end',function(){
		console.log( _allData );
		let _registerMsg = JSON.parse( _allData );

		// 1、在注册新用户之前，先查询，有没有同名
		findSameNameFn( _registerMsg, res);
	});
});

// 查询是否注册同名信息方法，若同名：则终止并提示；否则，调用插入新用户注册的书据的方法
function findSameNameFn( _registerMsg, res ){

	MongoClient.connect( DB_CONN_STR, function(err, db){
		// 数据库名：proShopCart
		var _dbo = db.db('proShopCart');
		// 集合名：userInfo
		var _collection = _dbo.collection( 'userInfo' );

		_collection.findOne({"username" : _registerMsg.username},{} , function(err, result){
			if(err) throw err;

			if( result === null ){
				// console.log('没有同名')
				insertNewUserName( _registerMsg, res );

			} else if( result.username === _registerMsg.username ){
				// console.log( '名字相同' )
				return res.send({
					regInfo:'名字已经存在',
					reg_code : 2
				});
			}
			db.close();
		});
	});
}

// 插入新用户注册数据的方法
function insertNewUserName( _registerMsg, res ){
	// 这个部分，示例代码里都有，同学们复制一下，不要自己写，很容易错
	MongoClient.connect( DB_CONN_STR, function(err, db){
		// 数据库名：proShopCart
		var _dbo = db.db('proShopCart');
		// 集合名：userInfo
		var _collection = _dbo.collection( 'userInfo' );

		_collection.insertOne( _registerMsg, function(err, result){
			if(err) throw err;
			console.log('注册成功！');
			return res.send({
				regInfo:'注册成功！',
				reg_code : 1
			});
			db.close();
		});
	});
}

// 登录功能
app.post('/userLogin_post',function(req,res){
	var _loginData = '';

	req.on('data',function(_d){
		_loginData += _d;
	});

	req.on('end',function(_d){
		// console.log( JSON.parse(_loginData) );
		let _tem = JSON.parse(_loginData);

		MongoClient.connect( DB_CONN_STR, function(err, db){
			// 数据库名：proShopCart
			var _dbo = db.db('proShopCart');
			// 集合名：userInfo
			var _collection = _dbo.collection( 'userInfo' );

			_collection.findOne({"username": _tem.u} ,{}, function(err, result){
				if(err) throw err;

				if( result === null ){
					console.log('用户不存在')
					return res.send({
						regInfo:'用户不存在',
						reg_code : 5
					});
				} else if( _tem.p !== result.password ){
					console.log('密码不对')
					return res.send({
						regInfo:'密码不对',
						reg_code : 4
					});
				} else if( result !== null && _tem.p == result.password ){
					console.log( '登录成功' )
					return res.send({
						regInfo: result ,
						reg_code : 3
					});
				}
				db.close();
			});
		});
	});
});

// 批量录入商品
app.post('/insertGoods',function(req, res){
	var _dataObj ='';

	req.on('data',function(_d){
		_dataObj += _d
	});

	req.on('end',function(_d){
		let _insertGoodsArrsObj = JSON.parse( _dataObj );
		// console.log( _insertGoodsArrsObj )
		MongoClient.connect( DB_CONN_STR, function(err, db){
			// 数据库名：proShopCart
			var _dbo = db.db('proShopCart');
			// 商品栏目集合名：goodsCategory
			var _collection = _dbo.collection( 'goodsCategory' );

			_collection.insertMany( _insertGoodsArrsObj, function(err, result){
				if(err) throw err;

				return res.send({
					regInfo:'商品录入成功！',
					reg_code : 5
				});
				db.close();
			});
		});
	});
});

// 获得商品列表-大类
app.get('/getGoodsCategory',function(req, res){
	MongoClient.connect( DB_CONN_STR, function(err, db){
		// 数据库名：proShopCart
		var _dbo = db.db('proShopCart');
		// 商品栏目集合名：goodsCategory
		var _collection = _dbo.collection( 'goodsCategory' );

		_collection.aggregate([{
			$lookup:{
				localField:'d',
				from:'goodsList_a',
				foreignField:'category',
				as:'goodsList_aa'
			}
		},{
			$lookup:{
				localField:'d',
				from:'goodsList_b',
				foreignField:'category',
				as:'goodsList_bb'
			}
		},{
			$lookup:{
				localField:'d',
				from:'goodsList_c',
				foreignField:'category',
				as:'goodsList_cc'
			}
		},{
			$lookup:{
				localField:'d',
				from:'goodsList_d',
				foreignField:'category',
				as:'goodsList_dd'
			}
		}]).toArray(function(err, result){
			if(err) throw err;

			return res.send( result );
			db.close();
		});
	});
});

//批量插入商品到DB，只运行一次，把商品插入到DB中就OK
//从数据中获取数据放在TempGoodsListObj中
function insertTempGoodsList(){

	let TempGoodsListObj=
	[{
		name:'GUCCI',price:22,category:'goodsList_d',img:"../../static/imgdata/clothes/gucci.jpg"
	},{
		name:'Only',price:33,category:'goodsList_d',img:"../../static/imgdata/clothes/only.jpg"
	},{
		name:'honeys',price:44,category:'goodsList_d',img:"../../static/imgdata/clothes/honeys.jpg"
	},{
		name:'乐町',price:55,category:'goodsList_d',img:"../../static/imgdata/clothes/letin.jpg"
	}]

	MongoClient.connect( DB_CONN_STR, function(err, db){
		// 数据库名：proShopCart
		var _dbo = db.db('proShopCart');
		// 商品栏目集合名：goodsCategory
		var _collection = _dbo.collection( 'goodsList_d' );

		_collection.insertMany(TempGoodsListObj, function(err, result){
			if(err) throw err;

			db.close();
		});
	});
}

	//insertTempGoodsList();

//根据id，获得对应商品信息
app.get('/getGoodsInfo',function(req,res){
	var _findId= req.query._id;
	var _c= req.query._c;

	// 生成一个mongoDB的id对象
	var _ObjectID = require('mongodb').ObjectID;
	var _ObjId = _ObjectID.createFromHexString( _findId );

	MongoClient.connect( DB_CONN_STR, function(err, db){
		// 数据库名：proShopCart
		var _dbo = db.db('proShopCart');
		// 集合名：userInfo
		var _collection = _dbo.collection( _c );

		//这里必须是双引号
		_collection.findOne({"_id" : _ObjId},{} , function(err, result){
			if(err) throw err;

			return res.send(result);
			db.close();
		});
	});
})

//查询栏目所属商品列表
app.get('/getCataGoryGoodsList',function(req,res){
	//这是传过来的各个集合
	var _c= req.query.categoryId;

	MongoClient.connect( DB_CONN_STR, function(err, db){
		// 数据库名：proShopCart
		var _dbo = db.db('proShopCart');
		// 集合名：userInfo
		var _collection = _dbo.collection( _c );

		//这里必须是双引号
		_collection.find().toArray( function(err, result){
			if(err) throw err;

			return res.send(result);
			db.close();
		});
	});
})

//分页
app.get('/getPageChange',function(req,res){
	var _s= req.query.startNum;
	var _c= req.query.c;

	MongoClient.connect( DB_CONN_STR, function(err, db){
		// 数据库名：proShopCart
		var _dbo = db.db('proShopCart');
		// 集合名：userInfo
		var _collection = _dbo.collection( _c );

		//这里必须是双引号
		//每次2条，跳过 _s 条
		_collection.find().limit(3).skip(Number(_s))
			.toArray( function(err, result){
			if(err) throw err;

			return res.send(result);
			db.close();
		});
	});

})

//轮播图
app.get('/getImgUrls',function(req,res){
	let imgObj={
		urls:[	"../../static/imgdata/slider/1.jpg",
				"../../static/imgdata/slider/2.jpg",
				"../../static/imgdata/slider/3.jpg",
				"../../static/imgdata/slider/4.jpg"
		]
	}

	 return res.send(imgObj)
})

app.listen( 5678,function(){
	console.log( '5678，中间件已经启动！' )
});